import axios from 'axios';
import { Message } from 'element-ui';
import router from "@/router/index.js";
import utils from "@/config/utils";
// 1 、 规定所有的接口， result.code == 1  表示成功，其它的都是失败，并且失败的时候一定会返回一个 result.msg 告诉为什么失败
// 2 、 所以说标准的接口，应该具备三个数据 code 、 msg 、 data
// 3 、 如果存在分页，可以将data 解析为 data: { total:100,currpage:1,pagesize:10,list:[] } 格式
// 4 、 根据code == 1 表示成功。 定义其它比如 code == 2 表示登录信息(token)过期,此时应该提示重新登录，或者静默登录
// 5 、 一般其它code 状态，，前端直接报错，提示 msg 字段的内容，如果没有，直接提示服务器错误

var instance = axios.create({
    baseURL: '',
    timeout: 5000,
    headers: {
        'X-Custom-Header': 'foobar'
    }
});


// 添加请求拦截器
instance.interceptors.request.use(function(config) {
    // 在发送请求之前做些什么
    return config;
}, function(error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
instance.interceptors.response.use(function(response) {
    // 对响应数据做点什么
    if (response.status == 200 || response.status == 304) {
        let res = response.data;
        if(res && res.code == 200){
            return Promise.resolve(res.data);
        }else if(res.code == 1003){
           // 登陆信息过期
           utils.clearUserId(); // 登陆过期，清除登陆信息
           router.push({
            path: "/login",
            query: {redirect: router.currentRoute.fullPath}// 将目的路由地址存入login的query中
           });
           
        }
        Message({
            message: res.msg || '服务器或网络错误',
            type: 'error'
        });
        return Promise.reject(res);
    } else {
        Message({
            message: '服务器或网络错误',
            type: 'error'
        })
        return Promise.reject(response)
    }
}, function(error) {
    // 对响应错误做点什么
    alert("响应错误")
    return Promise.reject(error);
});


let API = {
    get(url, params) {
        return instance.get(url, { params })
    },
    post: instance.post
}


async function LocalHttp(url,params = {}){
    let u = url.replace(/\//g,"_");
    console.info("req:"+url,params);
    if(!BlinkFunc[u]){
        Message({
            message: '方法不存在',
            type: 'error'
        });
        return Promise.reject({
            code:404,
            url:url
        });
    }

    if(typeof params == "object"){
        params = JSON.stringify(params);
    }
    try{
        let res = await BlinkFunc[u](params);
       
        let d = res[0];
        if(d){
            d = JSON.parse(d)
            console.log("res:",d);
            return Promise.resolve(d);
        }
        return Promise.resolve(res[0]);
    }catch(e){
        Message({
            message: e.message,
            type: 'error'
        });
        return Promise.reject(e);
    }
    
}


// 如果是本地化打包 exe
if(process.env.NODE_ENV == "local"){
    API = {
        async get(url,params={}){
            params.uid = parseInt(utils.getUserId()) || 0
            return LocalHttp(url,params);
        },
        async post(url,params={}){
            params.uid =  parseInt(utils.getUserId()) || 0
            return LocalHttp(url,params);
        }
    }
}

export default API